﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;

namespace Tools.Client
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            e.Handled = true;//无此语句, 软件将崩溃

            var dtNow = DateTime.Now;

            var sFile = $"{AppDomain.CurrentDomain.BaseDirectory}logs/{dtNow.ToString("yyyyMMdd")}_Exception.log";
            FileStream fs = new FileStream(sFile, FileMode.Create);
            var utf8Enc = new UTF8Encoding();

            Action<string, bool> writeStr = (src, indent) =>
            {
                if (indent)
                {
                    src = Regex.Replace(src, "^", "    ");
                }

                byte[] aData = utf8Enc.GetBytes(src);
                string sNewLine = "\r\n";
                fs.Write(aData, 0, aData.Length);
                aData = utf8Enc.GetBytes(sNewLine);
                fs.Write(aData, 0, aData.Length);
            };

            writeStr("错误信息:", false);
            writeStr(e.Exception.Message, true);
            writeStr("调用堆栈:", false);
            writeStr(e.Exception.StackTrace, true);

            if (e.Exception.InnerException != null)
            {
                writeStr("内部错误信息:", false);
                writeStr(e.Exception.InnerException.Message, true);
                writeStr("内部错误调用堆栈:", false);
                writeStr(e.Exception.InnerException.StackTrace, true);
            }

            fs.Close();
        }

    }
}
